package com.hangxin.commons.dao.impl;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import com.hangxin.commons.dao.BasicDao;
import com.hangxin.commons.util.PageModel;

/**
 * @author fq
 * 
 *         公共dao实现类
 * 
 */
@Repository
public class BasicDaoImpl extends JdbcTemplate implements BasicDao
{

	@Resource
	private DataSource dataSource;// 数据源对象



	/**
	 * 描述：获取数据源
	 */
	public DataSource getDataSource()
	{
		return this.dataSource;
	}



	/**
	 * 
	 * 方法描述： 带参数的数据保存操作
	 * <P/>
	 * 创建时间：2014-3-6
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * <P/>
	 * 修改人：无
	 * <P/>
	 * 修改时间：无
	 * <P/>
	 * 修改备注：无
	 * <P/>
	 * 
	 * @param sql
	 *            String类型 有参数的SQL语句
	 *            <P/>
	 * @param params
	 *            Object[]类型 参数数组对象
	 *            <P/>
	 * @return int类型 返回保存数据响应的行数
	 */
	public int save(String sql, Object[] params)
	{
		return this.update(sql, params);// update方法用于执行新增、修改、删除等语句；根据参数修改数据
	}



	/**
	 * 
	 * 方法描述： 带参数的数据更新操作
	 * <P/>
	 * 创建时间：2014-3-6
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * <P/>
	 * 修改人：无
	 * <P/>
	 * 修改时间：无
	 * <P/>
	 * 修改备注：无
	 * <P/>
	 * 
	 * @param sql
	 *            String类型 有参数的SQL语句
	 *            <P/>
	 * @param params
	 *            Object[]类型 参数数组对象
	 *            <P/>
	 * @return int类型 返回更新数据响应的行数
	 * 
	 */
	public int edit(String sql, Object[] params)
	{
		return this.update(sql, params);// 根据参数修改数据
	}



	/**
	 * 
	 * 方法描述： 不带参数的数据删除操作
	 * <P/>
	 * 创建时间：2014-3-6
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * <P/>
	 * 修改人：无
	 * <P/>
	 * 修改时间：无
	 * <P/>
	 * 修改备注：无
	 * <P/>
	 * 
	 * @param sql
	 *            String类型 SQL语句
	 *            <P/>
	 * @return int类型 返回更新数据响应的行数
	 * 
	 */
	public int delete(String sql)
	{
		return this.update(sql);// 删除数据
	}



	/**
	 * 
	 * 方法描述： 带参数的数据删除操作
	 * <P/>
	 * 创建时间：2014-3-6
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * <P/>
	 * 修改人：无
	 * <P/>
	 * 修改时间：无
	 * <P/>
	 * 修改备注：无
	 * <P/>
	 * 
	 * @param sql
	 *            String类型 有参数的SQL语句
	 *            <P/>
	 * @param params
	 *            Object[]类型 参数数组对象
	 *            <P/>
	 * @return int类型 返回更新数据响应的行数
	 * 
	 */
	public int delete(String sql, Object[] params)
	{
		return this.update(sql, params);// 根据参数删除数据
	}



	/**
	 * 
	 * 方法描述： 带参数获取一行数据
	 * <P/>
	 * 创建时间：2014-3-6
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * <P/>
	 * 修改人：无
	 * <P/>
	 * 修改时间：无
	 * <P/>
	 * 修改备注：无
	 * <P/>
	 * 
	 * @param sql
	 *            String类型 有参数的SQL语句
	 *            <P/>
	 * @param params
	 *            Object[]类型 参数数组对象
	 *            <P/>
	 * @param rm
	 *            RowMapper<T>类型 结果集对象
	 *            <P/>
	 * @return <T>类型 返回泛型对象
	 * 
	 */
	public <T> T find(String sql, Object[] params, RowMapper<T> rm)// RowMapper：用于将结果集每行数据转换为需要的类型
	{
		return query(sql, params, rm).get(0);
	}



	/**
	 * 
	 * 方法描述：带参数获取数据
	 * <P/>
	 * 创建时间：2014-3-6
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * <P/>
	 * 修改人：无
	 * <P/>
	 * 修改时间：无
	 * <P/>
	 * 修改备注：无
	 * <P/>
	 * 
	 * @param sql
	 *            String类型 有参数的SQL语句
	 *            <P/>
	 * @param params
	 *            Object[]类型 参数数组对象
	 *            <P/>
	 * @param rm
	 *            RowMapper<T>类型 结果集对象
	 *            <P/>
	 * @return <T>类型 返回泛型对象
	 * 
	 */
	public <T> List<T> findAll(String sql, Object[] params, RowMapper<T> rm)
	{
		return query(sql, params, rm);
	}



	/**
	 * 
	 * 方法描述： 不带参数的查询数据列表
	 * <P/>
	 * 创建时间：2014-3-6
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * <P/>
	 * 修改人：无
	 * <P/>
	 * 修改时间：无
	 * <P/>
	 * 修改备注：无
	 * <P/>
	 * 
	 * @param sql
	 *            String类型 SQL语句
	 *            <P/>
	 * @param classtype
	 *            Class<T>类型 类对象
	 *            <P/>
	 * @return List<T>类型 返回数据列表
	 * 
	 */
	public <T> List<T> findAll(String sql, Class<T> classtype)
	{
		return queryForList(sql, classtype);// 查询数据列表
	}



	/**
	 * 
	 * 方法描述： 不带参数查询结果行数
	 * <P/>
	 * 创建时间：2014-3-6
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * <P/>
	 * 修改人：无
	 * <P/>
	 * 修改时间：无
	 * <P/>
	 * 修改备注：无
	 * <P/>
	 * 
	 * @param sql
	 *            String类型 SQL语句
	 * 
	 */
	public int findByCount(String sql)
	{
		return queryForInt(sql);// 查询一行数据并返回int型结果
	}



	/**
	 * 
	 * 方法描述： 根据参数统计数据行数
	 * <P/>
	 * 创建时间：2014-3-6
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * <P/>
	 * 修改人：无
	 * <P/>
	 * 修改时间：无
	 * <P/>
	 * 修改备注：无
	 * <P/>
	 * 
	 * @param sql
	 *            String类型 有参数的SQL语句
	 *            <P/>
	 * @param params
	 *            Object[]类型 参数数组对象
	 *            <P/>
	 * @return int类型 返回更新数据响应的行数
	 * 
	 */
	public int findByCount(String sql, Object[] params)
	{
		return queryForInt(sql, params);
	}



	public int findByMaxId(String sql)
	{
		return queryForInt(sql);
	}



	public int findByMaxId(String sql, Object[] params)
	{
		return queryForInt(sql, params);
	}



	/**
	 * 
	 * 方法描述：不带参数的查询数据处理操作
	 * <P/>
	 * 创建时间：2014-3-6
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * <P/>
	 * 修改人：无
	 * <P/>
	 * 修改时间：无
	 * <P/>
	 * 修改备注：无
	 * <P/>
	 * 
	 * @param sql
	 *            String类型 有参数的SQL语句
	 *            <P/>
	 * @return String类型 返回字符串
	 * 
	 */
	public String getSn(String sql)
	{
		return queryForObject(sql, String.class);// 查询一行任何类型的数据，返回String对象
	}



	/**
	 * 
	 * 方法描述： 不带参数的查询数据处理操作
	 * <P/>
	 * 创建时间：2014-3-6
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * <P/>
	 * 修改人：无
	 * <P/>
	 * 修改时间：无
	 * <P/>
	 * 修改备注：无
	 * <P/>
	 * 
	 * @param sql
	 *            String类型 SQL语句
	 *            <P/>
	 * @param type
	 *            Class<T>类型 类对象
	 *            <P/>
	 * @return <T>类型 返回任意类型
	 * 
	 */
	public <T> T findName(String sql, Class<T> type)
	{
		return this.queryForObject(sql, type);// 查询一行任何类型的数据，最后一个参数指定返回结果类型
	}



	/**
	 * 
	 * 方法描述： 带参数的查询数据处理操作
	 * <P/>
	 * 创建时间：2014-3-6
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * <P/>
	 * 修改人：无
	 * <P/>
	 * 修改时间：无
	 * <P/>
	 * 修改备注：无
	 * <P/>
	 * 
	 * @param sql
	 *            String类型 有参数的SQL语句
	 *            <P/>
	 * @param params
	 *            Object[]类型 参数数组对象
	 *            <P/>
	 * @param classtype
	 *            Class<T>类型 类对象
	 *            <P/>
	 * @return <T>类型 返回任意类型
	 * 
	 */
	public <T> T findName(String sql, Object[] params, Class<T> type)
	{
		return this.queryForObject(sql, params, type);// 查询参数为params数据，返回type结果类型
	}



	/**
	 * 
	 * 功能描述：不带参数查询数据列表
	 * <P/>
	 * 创建时间：2013年3月13日
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * 
	 * @param sql
	 *            String类型 有参数的SQL语句
	 * @param params
	 *            Object[]类型 参数数组对象
	 * @return
	 */
	public List<Map<String, Object>> findMap(String sql)
	{
		return this.queryForList(sql);
	}



	/**
	 * 
	 * 功能描述：根据参数查询数据列表
	 * <P/>
	 * 创建时间：2013年3月13日
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * 
	 * @param sql
	 *            String类型 有参数的SQL语句
	 * @param params
	 *            Object[]类型 参数数组对象
	 * @return
	 */
	public List<Map<String, Object>> findMap(String sql, Object[] params)
	{
		return this.queryForList(sql, params);
	}


	@SuppressWarnings("unchecked")
	public Map<String, Object> findByMap(String sql, Object[] params){
		try{
		return this.queryForMap(sql, params);
		}catch(Exception e){
			
		}
		return null;
	}
	/**
	 * 
	 * 功能描述：分页查询
	 * <P/>
	 * 创建时间：2013年3月13日
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * 
	 * @param sqlcount
	 * @param sql
	 * @param pageModel
	 * @param paramscount
	 * @param params
	 * @return
	 */
	public PageModel<Map<String, Object>> listByObject(String sqlcount, String sql, PageModel<Map<String, Object>> pageModel, Object[] paramscount, Object[] params)
	{
		int pageNo = pageModel.getPageNo();// 第几页
		int pageSize = pageModel.getPageSize();// 每页多少条数数据
		int totalRecords = queryForInt(sqlcount, paramscount);// 查询记录总数
		List<Map<String, Object>> list = queryForList(sql, params);// 根据参数查询数据列表
		PageModel<Map<String, Object>> pm = new PageModel<Map<String, Object>>(pageNo, totalRecords, list, pageSize);
		return pm;
	}
	/**
	 * 
	 * 功能描述：分页查询
	 * <P/>
	 * 创建时间：2013年3月13日
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * 
	 * @param sqlcount
	 * @param sql
	 * @param pageModel
	 * @param paramscount
	 * @param params
	 * @return
	 */
	public PageModel<Map<String, Object>> listByObjectNoCount(
			String sql, PageModel<Map<String, Object>> pageModel,
			Object[] params)
	{
		
		List<Map<String, Object>> list = queryForList(sql, params);// 根据参数查询数据列表
		pageModel.setList(list);
		return pageModel;
	}


	/**
	 * 
	 * 功能描述：分页查询
	 * <P/>
	 * 创建时间：2013年3月13日
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * 
	 * @param sqlcount
	 * @param sql
	 * @param pageModel
	 * @return
	 */
	public PageModel<Map<String, Object>> listByObject(String sqlcount, String sql, PageModel<Map<String, Object>> pageModel)
	{
		int pageNo = pageModel.getPageNo();// 第几页
		int pageSize = pageModel.getPageSize();// 每页多少条数数据
		int totalRecords = queryForInt(sqlcount);// 查询记录总数
		List<Map<String, Object>> list = queryForList(sql);// 查询数据列表
		PageModel<Map<String, Object>> pm = new PageModel<Map<String, Object>>(pageNo, totalRecords, list, pageSize);
		return pm;
	}



	/**
	 * 
	 * 功能描述：分页查询
	 * <P/>
	 * 创建时间：2013年3月13日
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * 
	 * @param sqlcount
	 * @param sql
	 * @param pageModel
	 * @param paramscount
	 * @param params
	 * @param rowMapper
	 * @return
	 */
	public <T> PageModel<T> listByMapper(String sqlcount, String sql, PageModel<T> pageModel, Object[] paramscount, Object[] params, RowMapper<T> rowMapper)
	{
		int pageNo = pageModel.getPageNo();// 第几页
		int pageSize = pageModel.getPageSize();// 每页多少条数数据
		int totalRecords = queryForInt(sqlcount, paramscount);// 查询记录总数
		List<T> list = query(sql, params, rowMapper);// 根据参数查询数据列表
		PageModel<T> pm = new PageModel<T>(pageNo, totalRecords, list, pageSize);
		return pm;
	}



	/**
	 * 
	 * 功能描述：带参数的批量查询
	 * <P/>
	 * 创建时间：2013年3月13日
	 * <P/>
	 * 创建人： 李志远
	 * <P/>
	 * 联系方式： 1726021389@qq.com
	 * 
	 * @param sql
	 * @param params
	 * @return
	 */
	public int[] batchsql(String sql, String params)
	{
		final String[] idArray;
		int[] i = null;
		if (params != null)
		{
			idArray = params.split(",");
			i = batchUpdate(sql, new BatchPreparedStatementSetter()
			{
				public int getBatchSize()
				{
					return idArray.length;
				}



				public void setValues(PreparedStatement ps, int i)
				{
					int id = new Integer(idArray[i]).intValue();
					try
					{
						ps.setInt(1, id);
					} catch (SQLException e)
					{
						throw new RuntimeException(e);
					}
				}
			});
		}
		return i;
	}

	@Override
	public void proCallable(String statement) {
		this.execute(statement);
	}

}
